<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /* 
        变量到底是什么?
        可以变化的量(数据)
        由变量名和变量值(数据),用来读写这个数据
        一个变量对应一块小内存,数据保存在内存中,变量名是内存标识

        基本类型变量与引用数据类型变量的区别是什么?
            前置认识:一块小内存,有2各方面的数据,一是内存中保存的数据,另一个是内存中的地址
            一个保存的是基本类型数据  / 地址值数据
        
        给变量赋值到底做了什么?
            将右侧变量内存中的数据拷贝一份,保存到左侧变量内存中

        函数传参,到底是值传递还是引用传递?
            实参是基本变量,将实参变量内存的基本数据传递给形参变量  ==>值传递
            实参是引用变量,将实参变量内存的地址值数据传递给形参变量  ==>值传递/引用传递

        有哪些改变变量值的方式?
            给变量重新赋值:
            a.m = 3 => 没有改变c变量内存数据,改变是c指向的对象内部的属性数据

        如何理解下面两句编码演示说明?(重要!!!!!)
            2个引用变量指向同一个对象,如果通过一个变量修改对象内部的数据 => 另一个变量也能看到原对象(新数据)
            2个引用变量指向同一个对象,让其中一个变量指向一个新的对象 => 另一个引用变量看到的是老的对象

            // var a1 = 2
            // var a2 = {m: 1}
            // var a3 = a1 // 将a1内存中保存的数据(基本类型), 拷贝一份保存到a3内存中
            // var a4 = a2 // 将a2内存中保存的数据(引用类型/地址值), 拷贝一份保存到a4内存中

        */

        function fn(x) {

        }
        var a = 2
        fn(a) // x = a  => 值传递
        var b = {
            m: 2
        }
        fn(b) // x = b  // 值传递 => 传递的就是b变量内存中保存的数据
        // 引用传递 => b内存中保存的数据是引用类型(地址值)

        var c = 3
        c = {
            m: 2
        }
        c.m = 3 // 没有改变c变量内存数据, 改变是c指向的对象内部的属性数据

        var d1 = {
            m: 1
        }
        var d2 = d1

        // d1.m = 2
        // console.log(d2.m) // 2

        // d1 = {m: 2}
        // console.log(d2.m) // 1

        function fn(x) {
            // x = {m: 2}
            x.m = 3
        }
        var x = {
            m: 1
        }
        var y = x
        fn(x)
        console.log(x.m, y.m)
    </script>
</body>

</html>